/*
  @Author : remember lanyulei
  实现仪表板数据统计功能
*/

package dashboard //dashboard 包申明

import (
	"ferry/pkg/service" //包含业务逻辑和统计服务
	"ferry/tools/app"   //包含应用程序工具和错误处理函数
	"fmt"               //格式化I/O操作
	"strings"           //字符串处理函数
	"time"              //时间处理函数

	"github.com/gin-gonic/gin" //gin框架（用于构建HTTP服务器）
)

/*
  @Author : remember lanyulei
  @Date   : 2025/7/22
*/

// 处理HTTP请求，接受一个gin.Context参数C，处理请求和响应
func InitData(c *gin.Context) {
	var (
		err    error                    // 存储错误信息
		count  map[string]int           // 工单数量统计  类型为map[string]int
		ranks  []service.Ranks          //存储工单数据排名的结构，类型为[]service.Ranks
		submit map[string][]interface{} //存储工单提交数据统计结果，类型为map[string][]interface{}
		//存储请求中提供的开始时间和结束时间
		startTime string
		endTime   string
		//存储处理工单人员排行和工单处理耗时排行
		handle interface{}
		period interface{}
	)

	//处理URL查询参数
	startTime = c.DefaultQuery("start_time", "")
	endTime = c.DefaultQuery("end_time", "")
	//如果未提供时间参数
	if startTime == "" || endTime == "" {
		// 默认为最近7天的数据
		startTime = fmt.Sprintf("%s 00:00:00", time.Now().AddDate(0, 0, -6).Format("2006-01-02"))
		endTime = fmt.Sprintf("%s 23:59:59", time.Now().Format("2006-01-02"))
	} else { //参数存在，格式处理
		if strings.Contains(startTime, "T") && strings.Contains(endTime, "T") { //处理ISO 8601格式的时间
			startTime = fmt.Sprintf("%s 00:00:00", strings.Split(startTime, "T")[0]) //提取日期部分，补全起始时间
			endTime = fmt.Sprintf("%s 23:59:59", strings.Split(endTime, "T")[0])     //提取日期部分，补全结束时间
		}
	}
	//创建统计服务实例，携带处理后的时间范围参数
	statistics := service.Statistics{
		StartTime: startTime,
		EndTime:   endTime,
	}

	// 查询工单类型数据统计
	count, err = statistics.WorkOrderCount(c) //调用WorkOrderCount方法获取工单类型数据统计
	if err != nil {
		app.Error(c, -1, err, "查询工单类型数据统计失败")
		return
	}

	// 查询工单数据排名
	ranks, err = statistics.WorkOrderRanks() //调用WorkOrderRanks方法获取工单数据排名
	if err != nil {
		app.Error(c, -1, err, "查询提交工单排名数据失败")
		return
	}

	// 工单提交数据统计
	submit, err = statistics.DateRangeStatistics() //调用DateRangeStatistics方法获取工单提交数据统计
	if err != nil {
		app.Error(c, -1, err, "工单提交数据统计失败")
		return
	}

	// 处理工单人员排行榜
	handle, err = statistics.HandlePersonRank() //调用HandlePersonRank方法获取处理工单人员排行榜
	if err != nil {
		app.Error(c, -1, err, "查询处理工单人员排行失败")
		return
	}

	// 工单处理耗时排行榜
	period, err = statistics.HandlePeriodRank() //调用HandlePeriodRank方法获取工单处理耗时排行榜
	if err != nil {
		app.Error(c, -1, err, "查询工单处理耗时排行失败")
		return
	}

	app.OK(c, map[string]interface{}{
		"count":  count,  //类型统计
		"ranks":  ranks,  //数据排名
		"submit": submit, //提交数据统计
		"handle": handle, //处理工单人员排行
		"period": period, //工单处理耗时排行
	}, "")
}
